<?php

/*
 * Autor: Ivan Rodriguez (ivan.rodriguez.o@gmail.com)
 * Descripcion: Obtencion de datos de cuentas de Google por medio de OAuth y cURL
 *
 * Primero debemos hacer un llamado GET para obtener un codigo de acceso, el cual
 * posteriormente se canjea por un token de acceso:
 *
 * https://accounts.google.com/o/oauth2/auth?
 * &client_id=ID PROPORCIONADO POR GOOGLE API CONSOLE
 * &redirect_uri=URL REGISTRADA EN GOOGLE API CONSOLE
 * &scope=https://www.google.com/m8/feeds/  (A LOS DATOS QUE QUEREMOS ACCESA: SPREADSHEETS, CONTACTS, BUZZ...)
 * &response_type=code
 *
 * Como respuesta google llamara nuestro redirect URI pasando los parametros:
 * error=access_denied, en caso que haya denegado la solicitud de permisos
 * code=CODIGO DE ACCESO, en caso que haya aprobado la solicitud
 *
 * Posteriormente debemos hacer un llamado POST con el codigo de acceso para
 * obtener el token de acceso con el cual ya podemos hacer llamadas a la API:
 *
 * POST /o/oauth2/token HTTP/1.1
 * Host: accounts.google.com
 * Content-Type: application/x-www-form-urlencoded
 * code=CODIGO QUE NOS PASO A NUESTRA REDRECT URI
 * &client_id=ID PROPORCIONADO POR GOOGLE API CONSOLE
 * &client_secret=PROPORCIONADO POR GOOGLE API CONSOLE
 * &redirect_uri=URL REGISTRADA EN GOOGLE API CONSOLE
 * &grant_type=authorization_code
 *
 * Entonces recibiremos un JSON con el token de acceso:
 *
 * {
 * "access_token":"TOKEN DE ACCESO QUE USAREMOS",
 * "expires_in":3920,
 * "refresh_token":"1/6BMfW9j53gdGImsixUH6kU5RsR4zwI9lUVX-tqf8JXQ"
 * }
 */

session_start();

/*
 * Caso en el que obtuvimos el token de acceso. Quiere decir que ya podemos hacer
 * llamadas al servicio definido en SCOPE
 */
if (isset($_SESSION['access_token'])) {
    echo '<p>Respuesta de la llamada a la API: </p>';
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, SCOPE . '?alt=json&oauth_token=' . $_SESSION['access_token']);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    $respuesta = curl_exec($curl);
    if ($respuesta == false) {
        echo 'Error cURL en la peticion POST: ' . curl_error($curl);
    }
    curl_close($curl);
    /*
     * Convierte el json a un arreglo de PHP
     */
    $respuesta = json_decode($respuesta, true);
    echo '<pre>';
    print_r($respuesta);
    echo '</pre>';
    unset($_SESSION['access_token']);
    return;
}
/*
 * Caso en el que Google llama a index.php dando el codigo para solicitar token de acceso,
 * Entonces debemos hacer una peticion POST para obtener el access token, el cual
 * es retornado como un JSON
 */
elseif (isset($_GET['code'])) {
    /*
     * Hacer peticion POST por medio de cURL, tomado de:
     * http://www.electrictoolbox.com/php-curl-form-post/
     */
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, 'https://accounts.google.com/o/oauth2/token');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_POST, true);
    $parametros = array(
        'code' => $_GET['code'],
        'client_id' => CLIENT_ID,
        'client_secret' => CLIENT_SECRET,
        'redirect_uri' => REDIRECT_URI,
        'grant_type' => 'authorization_code'
    );
    curl_setopt($curl, CURLOPT_POSTFIELDS, $parametros);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    $respuesta = curl_exec($curl);
    if ($respuesta == false) {
        echo 'Error cURL en la peticion POST: ' . curl_error($curl);
    }
    curl_close($curl);
    /*
     * Convierte el json a un arreglo de PHP
     */
    $respuesta = json_decode($respuesta, true);
    // Inicializa la variabla de sesion que contiene el token de acceso
    $_SESSION['access_token'] = $respuesta['access_token'];
    // Recarga la pagina
    header('location: ' . REDIRECT_URI);
    return;
}
/*
 * Caso en el que el usuario no acepto darnos acceso a los permisos solicitados
 */
elseif (isset($_GET['error'])) {
    echo '<h1>El usuario denego el acceso a nuestra aplicacion :(</h1>';
    return;
}
/*
 * Redireccionando al usuario a la pagina donde se le pide si aprueba o deniega
 * el accesso de nuestra aplicacion a sus datos
 */
else {
    header('location: https://accounts.google.com/o/oauth2/auth?client_id=' . CLIENT_ID . '&redirect_uri=' . REDIRECT_URI . '&scope=' . SCOPE . '&response_type=code');
    return;
}
?>
